/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.asportoonline.integration;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.asportoonline.entities.Cliente;
import org.asportoonline.entities.Locale;
import org.asportoonline.entities.Prenotazione;

/**
 * Questa classe implementa i metodi di PrenotazioneFacade, necessari per interfacciarsi con l'entità
 * Prenotazione.
 * 
 * @author fe
 * @see PrenotazioneFacade
 */
@Stateless
public class PrenotazioneFacadeImplementation extends AbstractFacade<Prenotazione> implements PrenotazioneFacade {
    @PersistenceContext(unitName = "AsportoOnline-ejbPU")
    private EntityManager em;

    protected EntityManager getEntityManager() {
        return em;
    }

    public PrenotazioneFacadeImplementation() {
        super(Prenotazione.class);
    }

    /**
     * Cerca tutte le Prenotazioni effettuate da un cliente.
     * 
     * @param cliente Cliente che ha effettuato la Prenotazione.
     * @return restituisce una lista contenente tutte le prenotazioni effettuate dal Cliente  cliente; 
     * se il cliente non esiste o non ha effettuato prenotazioni restituisce null.
     * @see Prenotazione
     * @see Cliente
     */
    public List<Prenotazione> finAllUserPrenotations(Cliente cliente) {
        Query query = em.createQuery("select pren from Prenotazione pren where pren.cliente = :cliente order by pren.dataPrenotazione, pren.orarioPrenotazione");
        query.setParameter("cliente", cliente);
        List<Prenotazione> lpren = (List<Prenotazione>)query.getResultList();
        
        if(lpren==null || lpren.isEmpty())    return null;
        return lpren;
    }

    /**
     * Cerca tutte le Prenotazioni associate ad un locale.
     * 
     * @param locale 
     * @return restituisce una lista contenente tutte le prenotazioni associate al Locale locale;
     * se il locale non esiste o non ha prenotazioni associate restituisce null.
     * @see Prenotazione
     * @see Locale
     */
    public List<Prenotazione> finAllRestaurantPrenotations(Locale locale) {
        Query query = em.createQuery("select pren from Prenotazione pren where pren.locale = :locale order by pren.dataPrenotazione, pren.orarioPrenotazione");
        query.setParameter("locale", locale);
        List<Prenotazione> lpren = (List<Prenotazione>)query.getResultList();
        
        if(lpren==null || lpren.isEmpty())    return null;
        return lpren;
    }
    
    /**
     * Rimuove una prenotazione.
     * 
     * @param prenotazione  
     * @see Prenotazione
     */
    @Override
    public void remove(Prenotazione prenotazione) {
        //elimino tutti i prodotti prenotati
        Query query = em.createQuery("delete from ProdottoPrenotato pp where pp.idProdottoPrenotato.idpren = :idpren");
        query.setParameter("idpren", prenotazione.getIdPrenotazione());
        query.executeUpdate();
        
        //elimino la prenotazione
        query = em.createQuery("delete from Prenotazione p where p.idPrenotazione = :idpren");
        query.setParameter("idpren", prenotazione.getIdPrenotazione());
        query.executeUpdate();
    }

    /**
     * Cerca una Prenotazione in base all'ID.
     * 
     * @param idprenotazione  ID della prenotazione.
     * @return se l'ID esiste restituisce la Prenotazione, altrimenti restituisce null.
     * @see Prenotazione
     */
    public Prenotazione find(long idprenotazione) {
        Query query = em.createQuery("select p from Prenotazione p where p.idPrenotazione = :idpren");
        query.setParameter("idpren", idprenotazione);
        List<Prenotazione> lpren = (List<Prenotazione>)query.getResultList();
        if(lpren==null || lpren.isEmpty())  return null;
        return lpren.get(0);
    }
    
    
    
}
